Skip to content

feat(snapshot): add cow memory and resident pause lifecycle - #1537

Merged
appcypher merged 34 commits into
appcypher/live-root-disk-growthfrom
appcypher/cow-memory-lifecycle
Sep 10, 2026
Merged

feat(snapshot): add cow memory and resident pause lifecycle#1537
appcypher merged 34 commits into
appcypher/live-root-disk-growthfrom
appcypher/cow-memory-lifecycle

Conversation

@appcypher

@appcypher appcypher commented Sep 7, 2026

Copy link
Copy Markdown
Member

TL;DR

Add direct local branching, explicit CoW full-snapshot restore, resident pause/resume, and preferred .msb archive naming as stack item #8. The September 9 platform report records fixes for the earlier Windows ARM64 restore hang and private-memory gaps. Final integrated-head qualification is tracked separately below; Windows x86-64 remains untested.

Description

  • Stack directly on feat(storage)!: add live root-disk growth #1533 (appcypher/live-root-disk-growth) without importing unrelated Microsandbox main changes.
  • Add msb branch SOURCE --name CHILD and matching SDK methods for independent local children without publishing a durable full snapshot. A running source resumes after capture; a user-paused source stays paused.
  • Add restore-only --forked for private CoW memory on supported Linux, macOS, and Windows hosts, backed by a protected immutable cache with retained file ownership and reflink reuse where available. No source creation-time memory option is required; the superseded unreleased memory-snapshot API is removed.
  • Add pause/resume through the existing host control endpoint across CLI, Rust, Python, TypeScript, and Go, including repeated full capture while retaining a user pause.
  • Preserve ordinary resume identity, correct guest wall clock before workload thaw, and retain recovery ownership after uncertain freeze/thaw failures.
  • Prefer .msb in help and documentation while retaining content-based archive detection, legacy suffixes, explicit filenames, and plain-tar output.
  • Use published registry dependencies: msb_krun / msb_krun_utils 0.1.35, msb-vm-memory 0.18.0-msb.2, and msb-imago 0.1.7. Remove the development Cargo Git patches; retain the matching libkrunfw submodule pin.
  • Retain the historical September 9 platform matrix in scripts/smoke/reports/cow-platform-fixes-2026-09-09.md: eager/forked restore and direct branching pass on macOS ARM64, Linux x86-64, Linux ARM64/nested KVM, and Windows ARM64. These results apply to their recorded revisions, not a fresh full-platform qualification of 0.1.35 or subsequent integration changes.
  • Expose standalone running/paused disk-only capture through msb snapshot create NAME --from-sandbox SOURCE, including direct archive capture, without capturing RAM. It is crash-consistent; see scripts/smoke/reports/live-disk-snapshot-2026-09-09.md for the three-host flat/layered checks.
  • Store snapshots as immutable group members: the source sandbox name is the default group, --group selects another, and group:member selects an exact checkpoint. Bare groups resolve their selected heads; multi-archive imports resolve dependencies within the batch and explicitly selected group.
  • Support base-relative export with --since (disk layers and reused RAM objects), disk-layer selection with --last-layers, explicit-base restore, and manual live/stopped disk compaction. Successive disk-only capture/export still has the documented layer-ID limitation; full-checkpoint incremental exports are unaffected.

CLI examples

Branch a running sandbox

msb create alpine --name source --memory 512M
msb exec source -- sh -c 'echo original > /dev/shm/message'

# Capture current execution and start an independent child.
msb branch source --name child
msb exec child -- cat /dev/shm/message
# original

# Child writes stay private.
msb exec child -- sh -c 'echo changed > /dev/shm/message'
msb exec source -- cat /dev/shm/message
# original

# A child can itself be branched, including its private changes.
msb branch child --name grandchild
msb exec grandchild -- cat /dev/shm/message
# changed

branch captures RAM, disk, CPU and device state with a brief source pause, then starts a detached child. CoW is inherent: no --forked option is needed. It writes local backing but does not create a registered, durable full snapshot. Branching requires a new child name and currently rejects sources with published host ports.

Branch a paused source

msb pause source
msb branch source --name paused-child
# The child runs; source remains paused.
msb resume source

pause and resume keep the VM resident; neither creates a snapshot.

Save a durable full snapshot, then restore children

msb snapshot create saved --from-sandbox source --full

# Resume captured execution using private CoW memory.
msb create --name restored-forked --from-snapshot source:saved --forked

# Resume the same captured execution with eagerly copied memory.
msb create --name restored-eager --from-snapshot source:saved

The snapshot is installed in group source, so its exact selector is source:saved.

--forked selects the restored child's memory backing, not the snapshot's contents. It requires a full snapshot and cannot be combined with a fresh image boot or --disk-only.

Capture and restore directly through an archive

# Save directly to .msb without installing a snapshot directory.
msb snapshot create portable --from-sandbox source --full --archive ./portable.msb

# Restore directly into child staging, without first loading a snapshot directory.
msb create --name archive-child --from-snapshot ./portable.msb --forked

# Alternatively, use only the captured disk and perform a fresh boot.
msb create --name disk-child --from-snapshot ./portable.msb --disk-only

Export changes and compact explicitly

msb snapshot create later --from-sandbox source --full
msb snapshot save source:later changes.msb --since source:saved
msb snapshot load changes.msb --base source:saved --group received
msb create --name imported-child --from-snapshot received:later --forked

# Inspect and apply compaction; the count includes the base, never the writable head.
msb modify source --compact --layers 3 --dry-run
msb modify source --compact --layers 3

After compaction, export a new standalone baseline before exporting further deltas. This does not invalidate previously captured snapshots.

SDK examples

Each language also exposes branching on sandbox handles returned by get. The following examples assume an existing sandbox named source; full-restore examples use source:saved, the grouped snapshot created above.

Rust, inside an async fallible context:

use microsandbox::Sandbox;

let source = Sandbox::get("source").await?;
let child = source.branch("rust-child").await?;
let grandchild = child.branch("rust-grandchild").await?;
let restored = Sandbox::builder("rust-restored")
    .from_snapshot("source:saved")
    .forked()
    .create().await?;

Python, inside an async function:

from microsandbox import Sandbox

source = await Sandbox.get("source")
child = await source.branch("python-child")
grandchild = await child.branch("python-grandchild")
restored = await Sandbox.create(
    "python-restored", from_snapshot="source:saved", forked=True
)

TypeScript:

import { Sandbox } from "microsandbox";

const source = await Sandbox.get("source");
const child = await source.branch("node-child");
const grandchild = await child.branch("node-grandchild");
const restored = await Sandbox.builder("node-restored")
  .fromSnapshot("source:saved").forked().create();

Go, using m for github.com/superradcompany/microsandbox/sdk/go and an existing context:

source, err := m.GetSandbox(ctx, "source")
if err != nil { return err }
child, err := source.Branch(ctx, "go-child")
if err != nil { return err }
defer child.Close()
restored, err := m.CreateSandbox(ctx, "go-restored",
    m.WithFromSnapshot("source:saved"), m.WithForked())
if err != nil { return err }
defer restored.Close()

Stop the created children explicitly when finished; branching creates detached children.

Test Plan — historical evidence

The checked items below record prior runs at their documented revisions. They are not a claim that the final integrated branch with libkrun 0.1.35 and the latest transport changes has completed every test.

  • Registry-only dependency update: CLI build, 32 checkpoint tests, 39 snapshot tests, formatting, and the 56-step Mac direct-branch/full-restore/growth/compaction run. See scripts/smoke/reports/registry-dependencies-2026-09-09.md; Linux/Windows live matrices were not rerun for this packaging update.
  • Prior macOS/HVF release-build direct-branch checks: RAM/disk isolation, branch-of-branch after private writes, running/paused sources, backing ownership and same-name races; Python/TypeScript/Go native lifecycle smoke tests. Harnesses: scripts/smoke/cli/direct-branch.py and scripts/smoke/cli/branch-ownership.py.
  • September 9 direct-branch and --forked CLI matrices on Linux x86-64, Linux ARM64/nested KVM, and Windows ARM64; backing lifetime, failed-restore refusal, sibling isolation, and timer-progress regressions. See cow-platform-fixes-2026-09-09.md for exact coverage and limitations.
  • cargo fmt --all -- --check and git diff --check.
  • PYTHONPYCACHEPREFIX=/private/tmp/msb-stack8-pycache python3 -m py_compile scripts/smoke/cli/cow-memory-lifecycle.py.
  • cargo test -p microsandbox-runtime --lib --offline (179 tests; rerun outside the filesystem sandbox for temporary IPC sockets).
  • cd sdk/node-ts && npm run test:unit && npm run typecheck (137 tests).
  • Prior live CLI matrices on Linux/KVM and macOS/HVF, macOS Python/Node/Go SDK smoke tests, and Linux 256→384→256→512→256 MiB CoW resize with subsequent full lifecycle checks, as recorded in the report.
  • Windows ARM64 eager and forked full restore remain usable for guest commands in the corrected September 9 matrix. The old failure description and any older automated-review wording below are superseded by that report.

Current transport and integration qualification

Pushed head 5f46d63e contains runtime code tested at eada7e20; the only subsequent change expands the Windows CI filter to run both lifecycle-handoff and stdio-guard regressions. It includes the updated #7 base, libkrun 0.1.35 and the transport fixes. Earlier live results below are revision-scoped.

  • Integrated checks: 285 runtime, 66 protocol, and 31 migration tests passed, plus Clippy. Release build passed in 3m24s.
  • Frozen transport-fix revision f014: macOS and three Linux transport cohorts passed their normal and combined live matrices. These are not final-head/libkrun 0.1.35 qualification.
  • All 16 added SnapshotArchive invalid-receiver/constructor probes passed against an existing native binary. Initial integrated CodeQL gates were neutral/successful; the baseline alert was not suppressed. Fresh analysis and native CI remain separate checks.
  • Exact integrated-code Mac release run: nine of nine pipe/PTY/TCP pause, full-restore and branch cases passed in 200.552 seconds including setup and cleanup. Fresh commands completed before autonomous input gates. No owned runtime processes or resident sandboxes remained; temporary homes were removed.
  • Complete fresh stacked CI and final Linux/Windows ARM64 qualification. Latest Windows changes have not been live-rerun.
  • Confirm registry-only packaged/installed smoke with matching artifacts and no development overrides.

Integrated Mac SHA256: runtime f89c4ec3bf154b7daaf077c8185d98ffe37db02d6843635cc4c54e155a6cc339; agentd 3219165916e536620519b8a0a543c53a9449ba07635016153a8193444f2a41cf; firmware ea0d458cdc12a0fa6dac8d192542ddc39717f816da41176582905e31a8bf868c.

Performance is mixed: frozen Linux all-load PTY median improved 19.72%, but loaded-ping median increased from 0.066 to 1.649 ms during one upload trial, and small TCP latency also increased. These remain performance follow-ups, not a universal speedup claim.

Broader outstanding qualification remains Windows x86-64, NUMA combinations, physical-memory sharing/reclamation under pressure, broader concurrency/failure injection, and repeated release-build performance measurements.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains in the eligible follow-up review scope.

No blocking failure remains.

Reviews (6): Last reviewed commit: "build(deps): use published snapshot runt..." | Re-trigger Greptile

Use published msb_krun 0.1.33 in place of the superseded stack override.

Add atomic, pinned, read-only memory cache realizations keyed by complete
manifests. Cover warm reuse, concurrent publication, failed construction,
alignment, eviction, and unlink lifetime without exposing CoW policy yet.

Prefer .msnap in CLI help and SDK documentation while preserving explicit
filenames and content-detected legacy archives. Exercise eight encoding
and suffix combinations through direct capture and child staging.

This is stack-8 groundwork; public CoW and pause/resume integration and
end-to-end qualification remain pending.
Let capture borrow an executor-owned pause generation and workload latch,
validate the execution boundary, and leave that source paused on success
or failure. Keep the existing running-source call path unchanged.

Public pause ownership is not wired yet: agent freezer capability and
partial-failure replies must be disambiguated before basic-pause fallback
can be exposed safely. Existing checkpoint tests and runtime checks pass;
the borrowed-pause path still needs end-to-end qualification.
Record latch ownership before freezer writes and retain it after failed
freeze or thaw acknowledgement. Only confirmed thaw releases the latch.

Add optional attempt-scoped error details without a protocol generation
bump. Treat older ambiguous errors and transport failures as requiring
recovery, and fence mutations if acknowledged recovery fails.

Cover failure injection, retry ownership, protocol compatibility, and
host recovery disposition. Public pause/resume wiring remains pending.
Wire explicit memory policy and pause/resume through the CLI and Rust,
Python, Node, and Go SDKs. Preserve user pause ownership across full
captures and correct the guest clock before releasing workloads.

Restore from pinned immutable memory caches and prepare repeated capture
caches from immutable generations, reusing filesystem reflinks where
available. Resolve control endpoints and cache paths through the owning
local backend, and pin the matching runtime and firmware companions.

Add live lifecycle smoke matrices and record Linux/macOS results and
remaining qualification gaps. Windows CoW remains unsupported; private
zeroing on unplug does not yet reclaim host RAM. This commit does not
claim full stack-8 qualification.
Extend the live lifecycle runner with optional memory resizing,
unsupported CoW admission checks, archive retention diagnostics, and
explicit timeout evidence. Assert retained child contents after archive
removal and source shutdown.

Record passing Linux capacity convergence and Windows post-restore
command timeouts without treating activation latency as usable restore
performance. Keep incomplete qualification and implementation work
explicit in the report.
@Unique-Usman

Copy link
Copy Markdown

wow @appcypher this is a good one. This will be useful for the runmsb also

Capture device workers before interrupt-controller state and RAM so late
device completions cannot leave the checkpoint's queues and IRQs at
different boundaries.

Pin libkrun's processor, interrupt-controller and clock-state fixes.
Add portable delayed-restore clock and offline-CPU live fixtures, and
wait for application initialization in the lifecycle smoke runner.

Record passing Windows ARM64 and nested Linux ARM64 live matrices,
plus macOS and Linux x86 regressions. Keep native Windows x86 and
Windows CoW cache qualification limits explicit.
Avoid repeated closure validation and disposable staging syncs while retaining payload admission, persistent disk durability and guest activation ordering. Serialize CoW cache misses without serializing warm hits.

Preserve sparse archive members with long names, buffer archive extraction, and merge incremental memory extents with a consuming sweep. Resolve flat snapshot image metadata without materializing unused OCI disks and allow those sandboxes to restart without a VMDK.

Add correctness regression coverage and record release-build macOS benchmarks, old/new archive reader checks, empty-cache restoration, concurrent CoW restores and child isolation tests.
Create independent local children through the existing capture and restore paths without publishing a durable full snapshot. Reuse immutable RAM generations with reflinks and dirty ranges, and protect handoff and VM backing lifetimes with independent pins.

Expose branching across the CLI and Rust, Python, TypeScript and Go SDKs. Replace the unreleased memory-snapshot creation policy with restore-only forked selection, and reject unsupported or incomplete restore requests instead of falling back to a fresh boot.

Update documentation and add macOS live lifecycle, isolation, ownership and release benchmark harnesses. macOS release and SDK qualification passed; Linux and Windows qualification remains outstanding.
Enable Windows private RAM backing with protected cache entries and
cross-platform lifetime pins. Persist pending restore intent until
creation succeeds so failed children cannot cold-boot or mutate sealed
snapshot layers through later lifecycle operations.

Pin the published native memory and ARM64 interrupt/barrier fixes.
Add failed-restore and retained-sibling timer regressions, port ownership
checks to Windows, and document the four-host live qualification results.
Expose disk-only capture for running and user-paused managed and flat
sandboxes through the existing snapshot CLI and shared SDK paths.
Serialize root rollover in runtime control without capturing RAM or
advancing its baseline, preserve user pauses, and capability-gate older
runtimes. Keep stopped lifecycle locking and direct archive publication.

Update API documentation and record live flat/layered coverage on macOS
ARM64, Linux x86-64, and Windows ARM64, including active writes, source
isolation, direct archives, and mixed disk/full capture sequences.
Replace the development libkrun and vm-memory Git patches with the
published msb_krun 0.1.34 family and msb-vm-memory 0.18.0-msb.2.
Update imago to 0.1.7 so disk and runtime code share one memory crate.
Retain the existing firmware pin and the #7 stack base.

Record release validation, 32 checkpoint and 39 snapshot regressions,
and the successful Mac live branch/restore/growth/compaction run.
Pipeline capture persistence with two writers and three reusable 32 MiB
packs. Reuse runtime-owned immutable RAM object receipts across captures
and batch directory durability before the existing root-last publication.

Pipeline eager restoration and cold memory backing construction with
bounded verified buffers. Seed root journals from unchanged admitted disk
files, retaining at most 32 file handles and hashing copied or rewritten
layers. Keep SDK payload verification unchanged.

Use one authoritative pause/resume mutation and validate its resulting
state. Combine cgroup notifications with bounded state rechecks so kernel
notification throttling cannot impose an avoidable 10 ms wait.

Preserve snapshot formats, dirty-baseline ordering, clock-before-thaw,
durability and failure cleanup. Add work counters and regression tests for
corruption, cancellation, concurrent writers and low descriptor budgets.
Extend --since exports to omit RAM objects supplied by the explicit
base alongside the physical disk prefix. Preserve complete memory maps
and CPU/device metadata, and resolve borrowed objects into owned staging
for both snapshot load and direct archive restore.

Keep --last-layers limited to disk selection. Update CLI/SDK documentation
and add malformed-input, corruption, retention and twelve-generation
archive regressions, plus a reproducible live qualification harness.

Validate 44 snapshot tests on both macOS and Linux and live twelve-step
chains for flat, layered and tmpfs roots with eager and forked restores.
Record timings and qualification limits in the smoke report.

BREAKING CHANGE: replace the unreleased disk-only archive dependency
encoding with msb-snapshot-dependencies-v1, without a compatibility shim.
Standalone archives and snapshot descriptors remain unchanged.
@greptile-apps

greptile-apps Bot commented Sep 10, 2026

Copy link
Copy Markdown

Too many files changed for review (176 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

Remove automatic guest-wide sync from execution-state capture while
retaining workload freezing, host disk durability and clock-before-thaw
ordering. Document the crash-consistent disk-only extraction contract.

Use bounded sub-millisecond freezer rechecks, a lightweight CLI executor,
and WAL-aware read-only control lookups with existing installation and
schema gates. Reuse ambient configuration and route Go control lookups
through the same path.

Add dirty-memory checkpoint coverage and the macOS/Linux release report,
including 480 measured lifecycle cycles and flat/layered restore checks.
Admit operations through short-lived shared-handle locks so pending exec,
filesystem I/O and shutdown waits cannot block pause or resume. Preserve
consumed-handle rejection while admitted operations retain ownership.

Decode filesystem error envelopes before their payloads and propagate
paused-runtime diagnostics through unary and streaming operations.

Add ownership, cancellation and response-decoding tests, six live
concurrency cases on macOS and Linux, and the release timing report.
Both hosts passed all live cases and 137 Node unit tests; focused Rust
tests, TypeScript checks and native linting also passed.
Add group-scoped names and immutable member directories while preserving
portable snapshot identities across independent imports. Advance heads
only through known ancestry and retain concurrent sibling captures.

Carry source ancestry through capture, restore and local branch. Serialize
publication and retain cursor locks during cancellation. Expose group
selection and import options across the CLI and Rust, Python, Node and Go
SDKs. Update the path-keyed index, archive aliases and downgrade checks.

Cover group publication, duplicate imports, archive dependencies and
legacy artifact paths with automated tests and isolated macOS live
matrices for managed, flat and tmpfs roots.

BREAKING CHANGE: Bare snapshot names now select group heads. Address exact
members as group:member or use an explicit artifact path. Installed group
members cannot be overwritten with force.
Promote Branch & Snapshot with a fork icon and concise CLI examples.\nShow live branching and durable full snapshots in separate code groups.
Use app:saved to select the exact checkpoint under the source sandbox's
snapshot group, matching the current restore selector API.
Resolve disk and RAM dependencies across supplied archives and the
selected destination group, with an optional external base. Validate
complete owned closures before publishing members and select a group
head independently of archive order.

Expose batch loading through the CLI and Rust, Python, TypeScript, and
Go SDKs. Prefer .msb archive names throughout examples and documentation
without changing content-based decoding or archive schemas.

Record automated coverage and 102 macOS live command checks for full
and disk-only batches, including eager and forked restoration. Keep the
existing disk-only incremental-export limitation explicit.

BREAKING CHANGE: snapshot load takes one or more positional archives;
use --dest DIR instead of a positional destination directory.
Use --from-sandbox for snapshot capture, matching the existing SDK
source-sandbox naming. Update README, documentation, group examples,
and the branch, incremental, disk, and restore smoke scripts.

Test required source selection and rejection of --from, including
full capture, direct archives, and generated group members. All 13
snapshot parser tests pass.

BREAKING CHANGE: msb snapshot create requires --from-sandbox instead
of --from. No compatibility alias is provided.
Add a fast host-side snapshot/checkpoint test recipe and a bounded live
smoke suite for managed and flat disks. Cover branching, paused capture,
disk-only capture, grouped archive loading, eager/forked restore, and
source/child isolation. Verify runtime exit and reclaim successful test
homes while retaining reports and failure diagnostics.

Wire the smoke suite into Linux/KVM CI, document the commands, align
existing SDK/CLI tests with snapshot groups, and remove the extra
branching slogan from the README.
Merge the updated #7 parent into #8, preserving release transport,
runtime bootstrap, SDK lifecycle, and migration ordering. Record the
reviewed conflict resolutions without importing unrelated main changes.

Add bounded private freeze/thaw routing over the existing transport,
complete-frame capture barriers, retained input accounting, and restore
metadata validation. Keep generation 8 unchanged and replace only the
unreleased full-checkpoint contract. Preserve exact run ownership,
lineage publication, memory-cache pins, and failed-start cleanup.

Include focused regression tests, isolated live-test harnesses, and the
Mac/Linux qualification report. Native runtime and guest tests pass,
but retained-stdin control-credit starvation and mixed-load throughput
qualification remain open. This is a progress checkpoint, not a claim
that #8 is merge-ready.
Pin msb_krun and msb_krun_utils to the published 0.1.35 release and refresh only their matching lockfile entries.

Pick up runtime resolution of optional macOS GIC APIs without changing the snapshot format, guest protocol, or stack ancestry.
Keep stdio guard construction in the I/O error domain so the runtime spawn helper compiles on Windows. Own successful flag changes immediately and roll them back if a later handle update fails.

Add Windows regression tests for partial failure, duplicate handles and unchanged non-inheritable handles, and run them in both Windows CI jobs.

Account for Unix-only control-link parameters on Windows so the strict Clippy gate remains usable.
Separate retained input debt from metadata credit and allow bounded independent control progress without violating stream or lifecycle fences. Yield guest reads by actual work, preserve TCP half-close tails, and retain shared-memory payload ownership on combined transports.

Refresh maintenance clocks at transport admission, keep unrelated cleanup from fencing fresh commands, and strengthen source/child readiness checks under autonomous input pressure. Refuse incompatible unreleased transport barriers explicitly.

Validated the frozen patch with macOS and Linux live transport suites and benchmarks, plus protocol, guest, runtime and harness regression tests. Final stack integration with the newer registry dependency is checked separately.
Merge the updated immediate parent while retaining both Windows lifecycle-handoff and stdio-inheritance regression tests. Resolve the duplicate Windows endpoint-argument guard without changing its existing behavior.

Carry the release baseline, exact stack CI triggers and CI corrections forward. Formatting and diff checks pass; no unrelated main changes are included.
Merge the preserved transport fix commit onto the reconciled #8 branch. Its fourteen files are byte-for-byte identical to the macOS/Linux-qualified patch; retain the newer msb_krun 0.1.35 registry pin and both Windows test sets from the current stack.
Run all Windows-specific spawn regressions in the existing quality lane so the lifecycle-handoff cases preserved during stack reconciliation are executed alongside stdio inheritance cleanup. No runtime behavior changes.
Use the shared snapshot resolver from Python, retaining async not-found
errors and covering group, member, identity, directory and archive inputs.
Avoid the deprecated musl time_t alias without rounding freezer waits.
Use mirrored test images so registry authentication cannot hide regressions.
Integrate the reviewed parent fixes without changing branch, paused-source, or root-disk growth semantics. Carry source recovery diagnostics through final group and archive publication, and expose only confirmed artifact paths through the SDK errors.

Validate final group paths, head selection, ancestry cursors, artifact indexing, backend routing, and publication failures. The SDK suite passes 709 tests with two ignored; production Clippy and formatting pass.
Inherit the two parent binding lint fixes while retaining group-aware async snapshot resolution and unchanged Python keyword arguments. Final Python Clippy passes with warnings denied.
Keep the short /tmp default while allowing a separate short home parent on hosts with quota-limited tmpfs. Each test still creates its own isolated home and never borrows existing sandbox state.

Add a fixture regression for directory ownership and preserve the concurrent README update. All 34 transport harness unit tests pass.
@appcypher
appcypher merged commit 13155ca into releases/v0.7.0 Sep 10, 2026
133 checks passed
@appcypher
appcypher deleted the appcypher/cow-memory-lifecycle branch September 10, 2026 19:42
@Unique-Usman

Copy link
Copy Markdown

@appcypher good job getting this job done,

with this landed, I could go ahead and implement the pause and resume in the oci runtime right ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants